package invoker;

import java.awt.Dimension;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

import receiver.MEImpl;
import receiver.Sujet;
import sun.awt.HorizBagLayout;

import java.util.Hashtable;
import java.util.concurrent.ExecutionException;

import command.Command;

/**
 * R�presente l'interface graphique utilisateur
 * Implemente les interfaces IIHM (Invoker) et
 * Observateur (Observer)
 * @author 14009286
 *
 */
public class IHMImpl implements IIHM , Observateur  {
	/**
	 * la fenetre principale
	 */
	JFrame fenetre;
	/**
	 * la zone d'edition
	 */
	ZoneEdition zoneDeTexte;
	/**
	 * le listener 
	 */
	Ecouteur monEcouteur;
	/**
	 * le texte des modifications
	 */
	String texte = "";
	/**
	 * Observale : le moteur d'edition
	 */
	Sujet me;
	
	//les menus
	JMenuItem menuCopier ; 		        
	JMenuItem menuColler ;	
	JMenuItem menuCouper;	
	JMenuItem menuSaisir;
	JMenuItem menuSelectionner;
	JMenuItem menuEffacer;
	
	/**
	 * 
	 * @param me
	 */
	public IHMImpl (Sujet me){
		this.me = me;
		//commandes = new Hashtable<String, Command>();
		fenetre = new JFrame("Menu Editeur");
		zoneDeTexte = new ZoneEdition();
		this.monEcouteur = new Ecouteur();
		
		
		
		//on crée trois menu
		
		menuCopier = new JMenuItem("Copier"); 
		//menuCopier.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));		        
		menuColler = new JMenuItem("Coller");
		//menuColler.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));	
		menuCouper = new JMenuItem("Couper");
		//menuCouper.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));	
		menuSaisir = new JMenuItem("Saisir");
		menuSelectionner = new JMenuItem("Selectionner");
		menuEffacer = new JMenuItem("Effacer");
		
		//baree de menu
		JMenuBar menubar = new JMenuBar();
		JMenu menuEdition = new JMenu("Edition");
		JMenu menuFichier = new JMenu("Fichier");
		menuEdition.add(menuCopier);
		menuEdition.add(menuColler);
		menuEdition.add(menuCouper);
		menuEdition.add(menuSaisir);
		menuEdition.add(menuSelectionner);
		menuEdition.add(menuEffacer);
		menubar.add(menuFichier);
		menubar.add(menuEdition);
		fenetre.setJMenuBar(menubar);
		
		//on ajoute la zone de texte a la fenetre (dans un ScrolPane)
		JScrollPane scrollPane = new JScrollPane(zoneDeTexte);;
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		fenetre.setSize(600,700);
		fenetre.getContentPane().add(scrollPane);
		
		//on abonne les menus au linsteners de l'ecouteur
		menuColler.addActionListener(monEcouteur);
		menuCopier.addActionListener(monEcouteur);
		menuCouper.addActionListener(monEcouteur);
		menuSaisir.addActionListener(monEcouteur);	
		menuSelectionner.addActionListener(monEcouteur);
		menuEffacer.addActionListener(monEcouteur);
		
		//les actions du menuEdition sont inactifs au demarrage
		//menuColler.setEnabled(false);
		//menuCopier.setEnabled(false);
		//menuCouper.setEnabled(false);
		
		//les action saisir, selection et effacer son invisibles. 
		//Elles sont invoquées par les actions de la zoneEdition
		menuSaisir.setVisible(false);
		menuSelectionner.setVisible(false);
		menuEffacer.setVisible(false);
		
		//on abone la zoneEdition aux linstener de l'ecouteur
		zoneDeTexte.getDocument().addDocumentListener(monEcouteur);	
		zoneDeTexte.addCaretListener(monEcouteur);
		
		//on affiche la fenetre
		fenetre.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		fenetre.setVisible(true);
	}
	
	

	public void addCommand(String code, Command cmd){
		monEcouteur.addCommand(code, cmd);
	}

	public String getTexte(){
		return monEcouteur.getTexte();
	}

	@Override
	public int getPositionDebut() {
		return zoneDeTexte.getSelectionStart();
	}

	@Override
	public int getPositionFin() {
		return zoneDeTexte.getSelectionEnd();
	}


	//on s'actualise avec le moteur l'orsqu'il nous notifie d'un changement
	/**
	 * mettre a jour l'ihm(observateur)
	 * @param sujet: MEImpl (observer)
	 */
	@Override
	public void actualiser(Sujet suijet) {

		MEImpl me = (MEImpl) suijet;
		
				zoneDeTexte.setText(me.getContenuBuffer());
				//zoneDeTexte.setCaretPosition(me.getPostionDebutCurseur());
				zoneDeTexte.setSelectionStart(me.getPostionDebutCurseur());
				zoneDeTexte.setSelectionEnd(me.getPostionFintCurseur());
	

	}

	
}
